package com.yuer.rpc.netty_base;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class NettyService {


    public static void main(String[] args) {
        EventLoopGroup bossGroup = null;
        EventLoopGroup workGtoup = null;
        ChannelFuture channelFuture = null;
        try {
            // 第一步:创建一个bossGroup线程组：处理网络时间 -- 链接的事件
            bossGroup = new NioEventLoopGroup(1);// 这是最小线程数是1

            //第二步：创建workgroup线程组，处理网络时间 -- 读取时间
            workGtoup = new NioEventLoopGroup();

            // 第三步： 创建服务端助手
            ServerBootstrap  serverBootstrap = new ServerBootstrap();

            //第四步：设置bossgroup线程组和bossgroup线程组
            serverBootstrap.group(bossGroup,workGtoup);

            //第五步：设置通道的实现---》 nio的实现
            serverBootstrap.channel(NioServerSocketChannel.class); // 通道实现为nio
            //第6步：
            serverBootstrap.option(ChannelOption.SO_BACKLOG,128)
                    .childOption(ChannelOption.SO_KEEPALIVE,Boolean.TRUE);//在一定的时间内 发送报文，检查一下状态是不是活跃的

            //第七步：创建一个初始化通道对象
            serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
                @Override
                protected void initChannel(SocketChannel socketChannel) throws Exception {
                    //   //第八步：想pipLine 添加自定义的业务处理handler
                    socketChannel.pipeline()
                            .addLast(new NettyServiceHandler());
                }
            });

            //第九步：  启动服务端绑定端口，同时将异步改为同步 ,sync方法里面是this.await();意味着是同步的方法
            channelFuture = serverBootstrap.bind(9999) ;//.sync();

            channelFuture.addListener(new ChannelFutureListener() {
                @Override
                public void operationComplete(ChannelFuture channelFuture) throws Exception {
                    if(channelFuture.isSuccess()){
                        System.out.println("端口绑定成功: " +channelFuture.isSuccess());
                    }else {
                        System.out.println("端口绑定失败~");
                    }

                }
            });

            System.out.println("服务端启动成功.....");

            //第十步： 关闭通道和 关闭连接池
            // 按照顺序进行关闭，不然会内存泄漏
            // 注意：这个地方是不是 真正意义上的关闭，而是监听通道状态的关闭
            //这句话只是关闭状态
            channelFuture.channel().closeFuture().sync();
            bossGroup.shutdownGracefully();
            workGtoup.shutdownGracefully();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }/*finally {
            if(channelFuture != null){
                try {
                    channelFuture.channel().closeFuture().sync();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            if(bossGroup != null){
                bossGroup.shutdownGracefully();
            }
            if(workGtoup != null){
                workGtoup.shutdownGracefully();
            }
        }*/
    }

    public static void main2(String[] args) {
        // 1.定义一个变量,记录累加求和
        int sum = 0;

        // 2.循环遍历1到100之间的每个数字
        for(int i = 1; i <= 100; i++){

            // 3.再循环中判断该数是否为既是3的倍数又是5倍数
            //4.如果满足条件对该数进行累加求和
            if( i % 15 == 0 ){
                sum += i;
                System.out.println(" "+ i);
            }
        }


        // 5.循环结束后打印求和的变量
        System.out.println("1到100之间的既是3的倍数又是5倍数的数字之和为：" + sum);

        int ssum = 0 ;
        for(int i = 1; i <= 100; i++){

            // 3.再循环中判断该数是否为既是3的倍数又是5倍数
            //4.如果满足条件对该数进行累加求和
            if( i % 15 == 0 ){
                ssum += i;
                System.out.println(" "+ i);
            }
        }
        System.out.println("1到100之间的既是3的倍数又是5倍数的数字之和为：" + ssum);
    }
}
